<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //构造函数  凡是通过  new 关键字调用的都可以叫做构造函数
        //再调用之前没什么区别  具体 看是不是 通过 new 调用的
        //普通函数 默认  返回 undefined
        // 构造函数 默认 返回一个  实例对象
        // new 可以创建一个空白对象  并且 将this指向这个空白对象
        // 什么是原型对象  每个实例对象都会 在创建时 生成一个prototype  里面是对象结构  他就叫原型对象 
        //原型对象中的方法 可以给实例对象 共享 节省内存空间
        // 原型链 原型对象内部还有个prototype  也是一个原型对象 也就是说原型对象里面有原型对象 这种结构
        //我们叫他原型链
        // 构造函数中
        // this代表着 实例对象


        let obj1 = {
            name:"张三",
            age:22,
            spack:function(){
                console.log("我叫",this.name);
            },
            spack:function(){
                console.log("今年",this.age);
            }
        }
        console.log(obj1.spack());
        
        function People(name,age) {
            // console.log(1111);
            this.name = name  //往实例对象中 添加 key 叫 name  值是形参
            this.age = age//往实例对象中 添加 key 叫 age 值是形参
            //注意这里的this代表着（也就是指向）  实例对象
            // this.space = function(){
            //     console.log("我叫",name);
            // }
            // this.space2 = function(){
            //     console.log("jinnian",age);
                
            // }
            People.prototype.speak = function(){
                console.log("我靠",this.name);
            }
            People.prototype.speak2 = function(){
                console.log("今年",this.age);
            }
        }
        let a = new People(obj1.name,22)
        let b = new People("laowang",22)//返回的是一个根据传入参数  生成的实例对象
        let c = new People("hanbingyue",22)
        let d = new People("yinjiajie",22)
        
        console.log(a,b,c,d.space());//实例对象
        console.log(a.space === b.space);//不相等  也就意味着 内存里要多建一个空间来存放每一个对象的speak
        // 原型  将方法挂载在原型对象上  prototype 原型对象
        //优点  原型上的方法可以在实例对象中共享 不会再重复使用构造函数的时候  在内存中  重复创建

    </script>
</body>
</html>